<?php

class XQL_DataTransformation
{
	/**
	 * Asszociatív tömb, amely tárolja, hogy mely mezőkhöz milyen adatátalakító
	 * eljárást kell meghívni a mező értékének tárolásához. Az eljárást olyan
	 * formán kell megadni, hogy az a
	 * {@link http://php.net/call_user_func call_user_func}() PHP eljárás
	 * számára átadható legyen, és egyetlen paramétere az átalakítandó adatot
	 * tartalmazza.
	 *
	 * @var array
	 */
	protected $transformationDescriptorToEncode = array();

	/**
	 * Asszociatív tömb, amely tárolja, hogy mely mezőkhöz milyen
	 * adat-visszaalakító eljárást kell meghívni a mező értékének tárolásához.
	 * Az eljárást olyan formán kell megadni, hogy az a
	 * {@link http://php.net/call_user_func call_user_func}() PHP eljárás
	 * számára átadható legyen, és egyetlen paramétere a visszaalakítandó adatot
	 * tartalmazza.
	 *
	 * @var array
	 */
	protected $transformationDescriptorToDecode = array();

	public static function create()
	{
		return new XQL_DataTransformation();
	}

	public function addEncoder($forField, $encoder)
	{
		$this->transformationDescriptorToEncode[$forField] = $encoder;
		return $this;
	}

	public function addDecoder($forField, $decoder)
	{
		$this->transformationDescriptorToDecode[$forField] = $decoder;
		return $this;
	}

	public function encodeRecord($record)
	{
		$result = $record;
		foreach ($this->transformationDescriptorToEncode as $forField=>$encoder)
		{
			if (array_key_exists($forField, $record))
			{
				$record[$forField] = call_user_func($encoder, $record[$forField]);
			}
		}
		return $result;
	}

	public function decodeRecord($record)
	{
		$result = $record;
		foreach ($this->transformationDescriptorToDecode as $forField=>$decoder)
		{
			if (array_key_exists($forField, $record))
			{
				$record[$forField] = call_user_func($decoder, $record[$forField]);
			}
		}
		return $result;
	}

	public function encodeRecordset($recordset)
	{
		$result = $recordset;
		foreach ($recordset as $idx=>$record)
		{
			$result[$idx] = $this->encodeRecord($record);
		}
		return $result;
	}

	public function decodeRecordset($recordset)
	{
		$result = $recordset;
		foreach ($recordset as $idx=>$record)
		{
			$result[$idx] = $this->decodeRecord($record);
		}
		return $result;
	}
}

?>